package com.upc.cajabancos.bo;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import com.upc.cajabancos.dao.DetalleDocumentoPagoDAO;
import com.upc.cajabancos.dao.DetalleOrdenPagoDAO;
import com.upc.cajabancos.dao.DocumentoPagoDAO;
import com.upc.cajabancos.dao.EstadoCuentaDAO;
import com.upc.cajabancos.dao.OrdenPagoDAO;
import com.upc.cajabancos.model.DetalleDocumentoPago;
import com.upc.cajabancos.model.DocumentoPago;
import com.upc.cajabancos.model.EstadoCuenta;
import com.upc.cajabancos.model.OrdenPago;
import com.upc.cajabancos.util.DataAccessObjetc;

public class DocumentoPagoBO {
	
	/**
	 * Registra documento de pago de una orden de pago
	 * @author Cesar Jesus
	 * @since 30/01/2011
	 * @param documentoPago
	 */	
	public void registrarDocumentoPago(DocumentoPago documentoPago) throws Exception{
		
		DocumentoPagoDAO documentoPagoDAO = null;
		DetalleDocumentoPagoDAO detalleDocumentoPagoDAO = null;
		OrdenPagoDAO ordenPagoDAO = null; 
		DetalleOrdenPagoDAO detalleOrdenPagoDAO = null;
		
		Connection connection = null;
		String numero;
		
		try{
			connection = DataAccessObjetc.getConnection();
			connection.setAutoCommit(false);
			
			documentoPagoDAO = new DocumentoPagoDAO(connection);
			detalleDocumentoPagoDAO = new DetalleDocumentoPagoDAO(connection);
			ordenPagoDAO = new OrdenPagoDAO(connection);
			detalleOrdenPagoDAO = new DetalleOrdenPagoDAO(connection);
			
			numero = documentoPagoDAO.registrar(documentoPago);
			for (DetalleDocumentoPago detalle: documentoPago.getListaDetalle()) {
				detalleDocumentoPagoDAO.registrar(numero, detalle);
				detalleOrdenPagoDAO.actualizar(detalle.getDetalleOrdenPago());
			}
			
			for (OrdenPago ordenPago: documentoPago.getListaOrdenes()) {
				ordenPagoDAO.actualizar(ordenPago);
			}
			
			connection.commit();
		}
		catch(Exception e){
			e.printStackTrace();
			try {
				connection.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
				throw e1;
			}finally{
				DataAccessObjetc.close(connection);
			}
			throw e;
			
		}finally{
			DataAccessObjetc.close(connection);
		}
	}
	
	/**
	 * Registra documento de pago de un estado de cuenta
	 * @author Cesar Jesus
	 * @since 30/01/2011
	 * @param documentoPago
	 */	
	public void registrarDocumentoPagoEC(DocumentoPago documentoPago) throws Exception{
		
		DocumentoPagoDAO documentoPagoDAO = null;
		DetalleDocumentoPagoDAO detalleDocumentoPagoDAO = null;
		EstadoCuentaDAO estadoCuentaDAO = null;
		
		Connection connection = null;
		String numero;
		
		try{
			connection = DataAccessObjetc.getConnection();
			connection.setAutoCommit(false);
			
			documentoPagoDAO = new DocumentoPagoDAO(connection);
			detalleDocumentoPagoDAO = new DetalleDocumentoPagoDAO(connection);
			estadoCuentaDAO = new EstadoCuentaDAO(connection);
			
			numero = documentoPagoDAO.registrar(documentoPago);
			for (DetalleDocumentoPago detalle: documentoPago.getListaDetalle()) {
				detalleDocumentoPagoDAO.registrar(numero, detalle);
				estadoCuentaDAO.actualizar((EstadoCuenta)detalle.getDocumentoAsociado());
			}
			
			connection.commit();
		}
		catch(Exception e){
			e.printStackTrace();
			try {
				connection.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
				throw e1;
			}finally{
				DataAccessObjetc.close(connection);
			}
			throw e;
			
		}finally{
			DataAccessObjetc.close(connection);
		}
	}
	
	/**
	 * Registra documento de pago de otros
	 * @author Cesar Jesus
	 * @since 30/01/2011
	 * @param documentoPago
	 */	
	public void registrarDocumentoPagoOtros(DocumentoPago documentoPago) throws Exception{
		
		DocumentoPagoDAO documentoPagoDAO = null;
		DetalleDocumentoPagoDAO detalleDocumentoPagoDAO = null;
		
		Connection connection = null;
		String numero;
		
		try{
			connection = DataAccessObjetc.getConnection();
			connection.setAutoCommit(false);
			
			documentoPagoDAO = new DocumentoPagoDAO(connection);
			detalleDocumentoPagoDAO = new DetalleDocumentoPagoDAO(connection);
			
			numero = documentoPagoDAO.registrar(documentoPago);
			for (DetalleDocumentoPago detalle: documentoPago.getListaDetalle()) {
				detalleDocumentoPagoDAO.registrar(numero, detalle);
			}
			
			connection.commit();
		}
		catch(Exception e){
			e.printStackTrace();
			try {
				connection.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
				throw e1;
			}finally{
				DataAccessObjetc.close(connection);
			}
			throw e;
			
		}finally{
			DataAccessObjetc.close(connection);
		}
	}
	
	/**
	 * Busca documentos de pago
	 * @author Cesar Jesus
	 * @since 30/01/2011
	 * @param tipo
	 * @param estado
	 * @param idCliente
	 * @param desde
	 * @param hasta
	 * @return List<DocumentoPago>
	 */	
	public List<DocumentoPago> buscar(String tipo, String estado, String idCliente, Date desde, Date hasta) throws Exception{
		
		DocumentoPagoDAO documentoPagoDAO = null;
		
		Connection connection = null;
		List<DocumentoPago> listaDocumentoPagos = null;
		
		try{
			connection = DataAccessObjetc.getConnection();
			
			documentoPagoDAO = new DocumentoPagoDAO(connection);
			listaDocumentoPagos = documentoPagoDAO.buscar(tipo, estado, idCliente, desde, hasta);

		}
		catch(Exception e){
			e.printStackTrace();			
			throw e;
			
		}finally{
			DataAccessObjetc.close(connection);
		}
		return listaDocumentoPagos;
	}

}
